#include "Servidor.h"
#include <iostream>
using namespace std;

Servidor::Servidor(char* puerto, char* puerto_av) {
	this->escucha = new Socket();
	this->addr.sin_family = AF_INET;
	this->addr.sin_addr.s_addr = INADDR_ANY;
	this->addr.sin_port = htons(atoi(puerto));
	memset(&(this->addr.sin_zero), '\0', 8);

	this->sock_av = new Socket();
	this->addr_av.sin_family = AF_INET;
	this->addr_av.sin_addr.s_addr = INADDR_ANY;
	this->addr_av.sin_port = htons(atoi(puerto_av));
	memset(&(this->addr.sin_zero), '\0', 8);
}

void Servidor::ejecutar() {
	std::string nom_arch = "usuarios.txt";
	this->arch_usuarios.open(nom_arch.c_str());
	escucha->ignorarAAI();
	escucha->enlazar(&this->addr);
	escucha->escuchar();
	sock_av->ignorarAAI();
	sock_av->enlazar(&this->addr_av);
	sock_av->escuchar();
	while(1) {
		for(it = atencion_usuarios.begin();it != atencion_usuarios.end();it++)
			if(!(*it)->getAtendiendo()) {
				delete (*it);
				it = atencion_usuarios.erase(it);
			}
		cout << "Esperando connect 1" << endl;
		int fd = this->escucha->aceptar();
		if(fd == -1) {
			cout << "SALGO" << endl;
			break;
		}
		cout << "Esperando connect 2" << endl;
		int fd_av = this->sock_av->aceptar();
		if(fd_av == -1) {
			cout << "SALGO1" << endl;
			break;
		}
		cout << "Conectado a ambos sockets" << endl;
		AtencionUsuario* at_usuario = new AtencionUsuario(fd, fd_av, nom_arch, &clases, &mutex);
		at_usuario->start();
		atencion_usuarios.push_back(at_usuario);
	}
	arch_usuarios.close();
}

Servidor::~Servidor() {
	this->escucha->shutDown();
	delete escucha;
	this->sock_av->shutDown();
	delete sock_av;
	for(it = atencion_usuarios.begin();it != atencion_usuarios.end();it++)
		delete (*it);
}
